import cv2
import matplotlib.pyplot as plt

# 读取图像
image_path = 'tk.jpg'
image = cv2.imread(image_path)

# 将图像从BGR转换为灰度图像（如果需要处理灰度直方图）
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 准备计算各通道直方图的参数
channels = ['Blue', 'Green', 'Red']  # 对应BGR通道顺序
colors = ('b', 'g', 'r')             # 各通道对应的绘图颜色

# 计算彩色直方图
hist = cv2.calcHist([rgb_image], [0], None, [256], [0, 256])

# 绘制直方图
plt.figure()
plt.title("RGB Color Histogram")
plt.xlabel("Bins")
plt.ylabel("# of Pixels")
plt.plot(hist)
plt.xlim([0, 256])

# 遍历每个颜色通道
for channel_id, color in enumerate(colors):
    # 计算当前通道的直方图
    # 参数说明：
    # [image]       : 原图（注意是BGR格式）
    # [channel_id]  : 当前处理的通道索引（0=Blue, 1=Green, 2=Red）
    # None          : 无掩膜
    # [256]         : 直方图区间数
    # [0, 256]      : 像素值范围
    hist = cv2.calcHist([image], [channel_id], None, [256], [0, 256])

    # 绘制当前通道的直方图曲线
    plt.plot(hist, color=color, label=channels[channel_id], alpha=0.7)

# 添加图例并设置坐标轴范围
plt.legend()
plt.xlim([0, 256])

# 显示原始图像和直方图
plt.figure()
plt.title("Original Image(RGB)")
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.axis('off')

plt.show()

# import cv2
# import matplotlib.pyplot as plt
#
# # 读取图像
# image_path = 'tk.jpeg'
# image = cv2.imread(image_path)
#
# # 将图像从BGR转换为灰度图像（如果需要处理灰度直方图）
# gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#
# # 计算灰度直方图
# hist = cv2.calcHist([gray_image], [0], None, [256], [0, 256])
#
# # 绘制直方图
# plt.figure()
# plt.title("Grayscale Histogram")
# plt.xlabel("Bins")
# plt.ylabel("# of Pixels")
# plt.plot(hist)
# plt.xlim([0, 256])
#
# # 显示原始图像和直方图
# plt.figure()
# plt.title("Original Image")
# plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# plt.axis('off')
#
# plt.show()